home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / bin / nikto.pl < prev    next >
Perl Script  |  2005-10-19  |  7KB  |  201 lines

  1. #!/usr/bin/perl
  2. #VERSION,1.14
  3. use Getopt::Long;
  4. Getopt::Long::Configure('no_ignore_case');
  5.  
  6. # The LW require has been moved down about 40 lines...
  7.  
  8. #######################################################################
  9. # last update: 05.22.2005
  10. # --------------------------------------------------------------------#
  11. #                               Nikto                                 #
  12. # --------------------------------------------------------------------#
  13. # Copyright (C) 2001-2005 Sullo/CIRT.net, except as noted
  14. #
  15. # This program code is licensed under the GNU General Public License. This license does
  16. # not cover the database (".db") files, which are licensed individually, as described
  17. # in beginning of each file.
  18. #
  19. # This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License
  20. # as published by the Free Software Foundation; either version 2  of the License, or (at your option) any later version.
  21. #
  22. # This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
  23. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
  24. #
  25. # You should have received a copy of the GNU General Public License along with this program; if not, write to the 
  26. # Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  27. #
  28. # Contact Information:
  29. #  Sullo (sullo@cirt.net)
  30. #  http://www.cirt.net/
  31. #######################################################################
  32. # See the README.txt and/or help files for more information on how to use & config.  
  33. # See the LICENSE.txt file for more information on the License Nikto is distributed under.
  34. #
  35. # This program is intended for use in an authorized manner only, and the author
  36. # can not be held liable for anything done with this program, code, or items discovered
  37. # with this program's use.
  38. #######################################################################
  39. # global var/definitions
  40. use vars qw/@OPTS %CLI %VARIABLES $CONTENT $ITEMCOUNT @COOKIES %FILES $CURRENT_HOST_ID $CURRENT_PORT/;
  41. use vars qw/%CONFIG %NIKTO %OUTPUT %METHD %RESPS %INFOS %SERVER %request %result %JAR %DATAS %COUNTERS/;
  42. use vars qw/%CFG %UPDATES $DIV $VULS $OKTRAP $HOST %TARGETS @DBFILE @SERVERFILE @BUILDITEMS $PROXYCHECKED/;
  43.  
  44. # setup
  45. $NIKTO{version}="1.35";
  46. $NIKTO{name}="Nikto";
  47. $CFG{configfile}="/etc/nikto/nikto.conf";
  48.  
  49. # read the --config option
  50. {
  51.  my %optcfg;
  52.  Getopt::Long::Configure('pass_through', 'noauto_abbrev');
  53.  GetOptions(\%optcfg, "config=s");
  54.  Getopt::Long::Configure('nopass_through', 'auto_abbrev');
  55.  if (defined $optcfg{'config'})
  56.   {
  57.    $CFG{configfile} = $optcfg{'config'};
  58.   }
  59. }
  60.  
  61. $DIV = "-" x 75;
  62. my $STARTTIME=localtime();
  63. load_configs();
  64. find_plugins();
  65. require "$NIKTO{plugindir}/nikto_core.plugin";
  66. require "$NIKTO{plugindir}/LW.pm";
  67. # use LW;
  68.  
  69. general_config();
  70.  
  71. LW::http_init_request(\%request);
  72. $request{'whisker'}->{'lowercase_incoming_headers'}=1;
  73. $request{'whisker'}->{'timeout'}=$CLI{timeout} || 10;
  74. $request{'whisker'}->{'anti_ids'}=$CLI{evasion};
  75. $request{'User-Agent'} = $NIKTO{useragent};
  76. $request{'Host'} = $CLI{vhost} unless $CLI{vhost} eq "";
  77. proxy_setup();
  78.  
  79. open_output();
  80. nprint($DIV);
  81. print "- $NIKTO{name} $NIKTO{version}/$NIKTO{core_version}     -     www.cirt.net\n";
  82.  
  83. set_targets();
  84. load_scan_items();
  85. $PROXYCHECKED=0; # only do proxy_check once
  86.  
  87. # actual scan for each host/port
  88. foreach $CURRENT_HOST_ID (sort { $a<=>$b } keys %TARGETS)
  89.  {
  90.   $COUNTERS{hosts_completed}++;
  91.   if (($CLI{findonly}) && ($COUNTERS{hosts_completed} % 10) eq 0) { nprint("($COUNTERS{hosts_completed} of $COUNTERS{hosts_total})"); }
  92.   host_config();
  93.   $request{'whisker'}->{'host'} = $TARGETS{$CURRENT_HOST_ID}{hostname} || $TARGETS{$CURRENT_HOST_ID}{ip};
  94.  
  95.   foreach $CURRENT_PORT ( keys %{$TARGETS{$CURRENT_HOST_ID}{ports}} )
  96.    {
  97.     if ($CURRENT_PORT eq "") { next; }
  98.     $request{'whisker'}->{'port'}=$CURRENT_PORT;
  99.     $request{'whisker'}->{'ssl'}=$TARGETS{$CURRENT_HOST_ID}{ports}{$CURRENT_PORT}{ssl};
  100.     $request{'whisker'}->{'http_ver'}=$CONFIG{DEFAULTHTTPVER};
  101.     if ($CONFIG{'STATIC-COOKIE'} ne "") { $request{'Cookie'} = $CONFIG{'STATIC-COOKIE'}; }
  102.  
  103.     get_banner();
  104.  
  105.     if ($CLI{findonly}) 
  106.     { 
  107.      my $protocol="http";
  108.      if ($TARGETS{$CURRENT_HOST_ID}{ports}{$CURRENT_PORT}{banner} eq "") { $TARGETS{$CURRENT_HOST_ID}{ports}{$CURRENT_PORT}{banner}="(no identification possible)"; }
  109.      if ($TARGETS{$CURRENT_HOST_ID}{ports}{$CURRENT_PORT}{ssl}) { $protocol .= "s"; }
  110.      nprint("+ Server: $protocol://$TARGETS{$CURRENT_HOST_ID}{display_name}:$CURRENT_PORT\t$TARGETS{$CURRENT_HOST_ID}{ports}{$CURRENT_PORT}{banner}");
  111.      next;
  112.     }
  113.  
  114.     $VULS=0;
  115.     dump_target_info();
  116.     check_responses();
  117.     check_cgi();
  118.     set_scan_items();
  119.     run_plugins();
  120.     test_target();
  121.    }
  122.  }
  123.  
  124. nprint("+ $COUNTERS{hosts_total} host(s) tested");
  125.  
  126. send_updates();
  127. close_output();
  128. exit;
  129.  
  130. #################################################################################
  131. ####                  Most subs in nikto_core.plugin                         ####
  132. #################################################################################
  133. # load config file
  134. sub load_configs
  135. {
  136.  open(CONF,"<$CFG{configfile}") || print STDERR "- ERROR: Unable to open config file '$CFG{configfile}' ($!), only 1 CGI directory defined.\n";
  137.  my @CONFILE=<CONF>;
  138.  close(CONF);
  139.  
  140.  foreach my $line (@CONFILE)
  141.  {
  142.   $line =~ s/\#.*$//;
  143.   chomp($line);
  144.   $line =~ s/\s+$//;
  145.   $line =~ s/^\s+//;
  146.   if ($line eq "") { next; }
  147.   my @temp=split(/=/,$line,2);
  148.   if ($temp[0] ne "") { $CONFIG{$temp[0]}=$temp[1]; }
  149.  }
  150.  
  151.  # add CONFIG{CLIOPTS} to ARGV if defined...
  152.  if ($CONFIG{CLIOPTS} ne "")
  153.   {
  154.    my @t=split(/ /,$CONFIG{CLIOPTS});
  155.    foreach my $c (@t) { push(@ARGV,$c); }
  156.   }
  157.   return;
  158. }
  159. #################################################################################
  160. # find plugins directory
  161. sub find_plugins
  162. {
  163.  # get the correct path to 'plugins'
  164.  # if defined in nikto.conf file...
  165.  if ($CONFIG{PLUGINDIR} ne "")
  166.   {
  167.    if (-d $CONFIG{PLUGINDIR}) { $NIKTO{plugindir}=$CONFIG{PLUGINDIR}; }
  168.   }
  169.  
  170.  if ($NIKTO{plugindir} eq "")
  171.   { 
  172.    # try pwd?
  173.    my $NIKTODIR="";
  174.    if (-d "$ENV{PWD}/plugins") { $NIKTODIR="$ENV{PWD}/"; }
  175.    elsif (-d "plugins") { $NIKTODIR=""; }
  176.    else
  177.    {
  178.     my $EXECDIR=$ENV{_};
  179.     chomp($EXECDIR);
  180.     $EXECDIR =~ s/nikto.pl$//;
  181.     if ($EXECDIR =~ /(perl|perl\.exe)$/) { $EXECDIR=""; }  # executed as 'perl nikto.pl' ...
  182.     if (-e "$EXECDIR/plugins") { $NIKTODIR="$EXECDIR/"; }
  183.    }
  184.    $NIKTO{plugindir}="$NIKTODIR"; $NIKTO{plugindir} .= "plugins";
  185.   }
  186.  
  187.   if (!(-d $NIKTO{plugindir}))
  188.   {
  189.    print STDERR "I can't find 'plugins' directory. I looked around:\n";
  190.    print STDERR "\t$CONFIG{PLUGINDIR}\n\t$ENV{PWD}\n\t$ENV{_}\n";
  191.    print STDERR "Try: switch to the 'nikto' base dir, or\n";
  192.    print STDERR "Try: set PLUGINDIR in nikto.conf\n";
  193.    exit;
  194.   }
  195.  $NIKTOFILES{dbfile}="$NIKTO{plugindir}/scan_database.db";
  196.  $NIKTOFILES{userdbfile}="$NIKTO{plugindir}/user_scan_database.db"; 
  197.  $NIKTOFILES{serverdbfile}="$NIKTO{plugindir}/servers.db"; 
  198. return;
  199. }
  200. #################################################################################
  201.